from sqlalchemy import MetaData, Table, Column, Integer, String, Float, DateTime, TIMESTAMP, JSON, BigInteger, UniqueConstraint

metadata = MetaData()

# 分钟K线表（添加 symbol+time 唯一约束）
symbol_min = Table(
    'symbol_min', metadata,
    Column('id', BigInteger, primary_key=True, autoincrement=True),
    Column('symbol', String(20), nullable=False),
    Column('time', TIMESTAMP, nullable=False),
    Column('open', Float, nullable=False),
    Column('close', Float, nullable=False),
    Column('high', Float, nullable=False),
    Column('low', Float, nullable=False),
    Column('volume', Float, nullable=False),
    Column('amount', Float, nullable=False),
    # 添加联合唯一约束（与数据库索引名称一致）
    UniqueConstraint('symbol', 'time', name='idx_unique_symbol_time')
)

# Tick表（添加 symbol+created_at 唯一约束）
symbol_tick = Table(
    'symbol_tick', metadata,
    Column('id', BigInteger, primary_key=True, autoincrement=True),
    Column('symbol', String(20), nullable=False),
    Column('open', Float),
    Column('high', Float),
    Column('low', Float),
    Column('price', Float, nullable=False),
    Column('cum_volume', Integer),
    Column('cum_amount', Float),
    Column('trade_type', Integer),
    Column('last_volume', Integer),
    Column('cum_position', Integer),
    Column('last_amount', Float),
    Column('created_at', DateTime, nullable=False),
    Column('iopv', Float),
    Column('quotes', JSON),
    # 添加联合唯一约束（与数据库索引名称一致）
    UniqueConstraint('symbol', 'created_at', name='idx_unique_symbol_created_at')
)

symbol_group = Table(
    'symbol_group', metadata,
    Column('symbol', String(30), primary_key=True),
    Column('position', JSON)  # 使用JSON存储成分股列表
)

symbol_name = Table(
    'symbol_name',metadata,
    Column('symbol',String(20),primary_key=True),
    Column('symbol_name',String(20))
)


symbol_min_range = Table(
    'symbol_min_range', metadata,
    Column('symbol', String(20), primary_key=True),
    Column('start_time', DateTime, primary_key=True),
    Column('end_time', DateTime),
    mysql_engine='InnoDB',
    mysql_charset='utf8mb4'
)

symbol_tick_range = Table(
    'symbol_tick_range', metadata,
    Column('symbol', String(20), primary_key=True),
    Column('start_time', DateTime, primary_key=True),
    Column('end_time', DateTime),
    mysql_engine='InnoDB',
    mysql_charset='utf8mb4'
)
# 回测摘要表
backtest_summary = Table(
    'backtest_summary', metadata,
    Column('name', String(100), primary_key=True),  # 回测名称（用户指定或时间戳）
    Column('start_time', DateTime, nullable=False), # 回测开始时间
    Column('end_time', DateTime, nullable=False),   # 回测结束时间
    Column('initial_cash', Float, nullable=False),  # 初始资金
    Column('final_value', Float, nullable=False),   # 最终资金
    Column('total_return', Float),                  # 总收益率（百分比）
    Column('annual_return', Float),                 # 年化收益率（百分比）
    Column('max_drawdown', Float),                  # 最大回撤（百分比）
    Column('total_fees', Float),                    # 总手续费
    Column('trade_days', Integer),                  # 交易天数
    Column('total_trades', Integer),                # 总交易次数
    
    # 新增的关键绩效指标字段
    Column('sharpe_ratio', Float),                  # 夏普比率
    Column('sortino_ratio', Float),                 # 索提诺比率
    Column('win_trades', Integer),                  # 盈利交易次数
    Column('loss_trades', Integer),                 # 亏损交易次数
    Column('win_rate', Float),                     # 胜率（百分比）
    Column('avg_win', Float),                      # 平均盈利金额
    Column('avg_loss', Float),                     # 平均亏损金额
    Column('profit_factor', Float),                # 盈亏比
    
    # 新增的风险管理指标
    Column('volatility', Float),                   # 年化波动率（百分比）
    Column('max_drawdown_start', DateTime),        # 最大回撤开始日期
    Column('max_drawdown_end', DateTime),          # 最大回撤结束日期
    Column('max_drawdown_duration', Integer),      # 最大回撤持续天数（天）
    
    # 新增的持仓信息
    Column('end_position_count', Integer),         # 期末持仓股票数量
    Column('end_position_ratio', Float),           # 期末持仓比例（百分比）
    
    mysql_engine='InnoDB',
    mysql_charset='utf8mb4'
)

# 回测每日资产表
backtest_daily = Table(
    'backtest_daily', metadata,
    Column('backtest_name', String(100), primary_key=True),  # 外键，关联backtest_summary.name
    Column('date', DateTime, primary_key=True),              # 日期
    Column('cash', Float),                                   # 当日现金
    Column('position_value', Float),                         # 当日持仓市值
    Column('total_asset', Float),                            # 总资产
    Column('daily_return', Float),                           # 收益率列                          
    mysql_engine='InnoDB',
    mysql_charset='utf8mb4'
)

# 回测交易细节表
backtest_trades = Table(
    'backtest_trades', metadata,
    Column('backtest_name', String(100), primary_key=True),  # 外键，关联backtest_summary.name
    Column('trade_id', Integer, primary_key=True),          # 交易ID
    Column('date', DateTime, nullable=False),               # 交易日期
    Column('symbol', String(20), nullable=False),           # 交易标的
    Column('action', String(10), nullable=False),           # 买入或卖出
    Column('price', Float, nullable=False),                 # 交易价格
    Column('amount', Integer, nullable=False),              # 交易数量
    Column('fee', Float, nullable=False),                   # 交易费用
    Column('value', Float),                                 # 交易价值（买入为负，卖出为正）
    Column('profit', Float),                                # 交易盈亏
    Column('return_pct', Float),                            # 交易回报率
    mysql_engine='InnoDB',
    mysql_charset='utf8mb4'
)